/**
 * 语言相关工具包，包含以下功能：
 * ·json转换、对象类型判断
 * ·对数字、数组、字符串等对象的简便操作
 */
define(function(){
	window.lu = window.LangUtils = {
		/**
		 * 将json字符串转换成json，转换失败返回原字符串
		 */
		parseJson: function(jsonStr){
			try{
				return Ext.util.JSON.decode(jsonStr);
			}
			catch(e){
				return jsonStr;
			}
		},
		/**
		 * 将对象转换为字符串
		 * @param obj 要查看的对象
		 * @param showAll 是否查看所有子属性，对复杂对象不要使用此参数
		 */
		toString: function(obj, showAll){
			if (showAll){
				return Ext.encode(obj);
			}
			var result = '';
			if (obj == null || typeof obj !== 'object'){
				result = obj;
			}
			else{
				var r = [];
				for (var p in obj){
					var v = obj[p];
					if (this.isStr(v)) v = '\'' + (v.length > 200 ? v.substring(0, 198) + '...' : v) + '\'';
					else if (this.isFn(v)) v = '[Function]';
					else v = '' + obj[p] + '';
					v = v.replace(/</g, '&lt;');
					r.push("'" + p +"': " + v);
				}
				result = r.length > 0 ? '{' + r.join('<br>') + '}' : obj.toString();
			}
			return result;
		},
		/**
		 * 对所有元素是相同对象的数组做过滤，过滤出指定属性的值，返回新的数组或字符串，支持子属性。
		 * @param array 要做过滤的数组，里面的对象类型必须是统一的。
		 * @param propName 要过滤出的属性名称，支持子属性，如a.b.c
		 * @param separator 分隔符，如果此参数不为空，则返回以此参数为分隔的字符串，否则返回数组。
		 * @return 数组或字符串
		 */
		pluck: function(array, propName, separator){
			if (!array) return null;
			var values = [];
			var props = propName.split('.');
			Ext.each(array, function(item){
				var v = item;
				Ext.each(props, function(prop){
					if (!v[prop]){
						v = null; return false;
					}
					v = v[prop];
				});
				values.push(v);
			});
			return separator ? values.join(separator) : values;
		},
		/**
		 * 过滤数组元素，返回符合条件的元素数组。如果没有元素则返回空数组。
		 * @param array 要过滤元素为数组
		 * @param fn 判断是否符合条件的方法，参数为array中的元素
		 * @param scope fn的this指向
		 */
		filterArray: function(array, fn, scope){
			if (!array || !fn) return array;
			var result = [];
			Ext.each(array, function(item){
				if (fn.call(scope || item, item)) result.push(item);
			});
			return result;
		},
		/**
		 * 给对象的每个属性名添加指定的前缀，返回新对象
		 */
		addPrefToProps: function(obj, pref){
			var newObj = {};
			for (var p in obj){
				newObj[pref + p] = obj[p];
			}
			return newObj;
		},
		/**
		 * 指定最大长度截取字符串，如果超长在后面添加(...)
		 * @param text 被截取的字符串
		 * @param maxLen 最大长度
		 */
		cutText: function(text, maxLen){
			if (!text || !text.length) return text;
			return text.length <= maxLen ? text : text.substring(0, maxLen) + '...';
		},
		/**
		 * 将秒数转换成xx天xx时xx分xx秒的格式
		 */
		formatSeconds: function(seconds){
			var d, h, m , s;
			s = seconds;
			if (s > 60){
				m = Math.floor(s / 60);
				s = /^\d+$/.test(seconds) ? s % 60 : (s % 60).toFixed(1);
			}
			if (m > 60){
				h = Math.floor(m / 60);
				m = m % 60;
			}
			if (h > 24){
				d = Math.floor(h / 24);
				h = h % 24;
			}
			return (d ? d + '天' : '') +
				(h ? h + '时' : '') +
				(m ? m + '分' : '') +
				(s ? s + '秒' : '');
		},
		/**
		 * 将文件大小(B)转换为G,M,K来表示的格式
		 */
		formatSize: function(size){
			if (size < 1000)
    			return size + " B";
    		size /= 1024.0;
    		if (size < 1000)
    			return Math.round(size * 100) / 100.0 + " KB";
    		size /= 1024.0;
    		if (size < 1000)
    			return Math.round(size * 100) / 100.0 + " MB";
    		size /= 1024.0;		
    		return Math.round(size * 100) / 100.0 + " GB";
		},
		/**
		 * 默认格式化时间：yyyy-MM-dd HH:mm:ss
		 */
		formatTimeDefault: function(value){
			try{
				var time = lu.isDate(value) ? value : new Date(value);
				return time ? time.format('Y-m-d H:i:s') : '';
			}
			catch(e){}
			return '';
		},
		/**
		 * 如果传入的参数是整数则转换为整数，不是则返回defaultValue。
		 */
		int: function(v, defaultValue){
			if (/^-?[0-9]+$/.test(v)){
				return parseInt(v);
			}
			else{
				return defaultValue || null;
			}
		},
		isEmpty: function(obj){
			return Ext.isEmpty(obj);
		},
		isFn: function(v){
			return Ext.isFunction(v);
		},
		isObj: function(v){
			return typeof v === 'object';
		},
		isStr: function(v){
			return typeof v === 'string';
		},
		isArray: function(v){
			return v instanceof Array;
		},
		isUndefined: function(v){
			return v === undefined;
		},
		isDate: function(v){
			return v instanceof Date;
		},
		none: null //占位
	};
	/**
	 * 字符串对象添加格式化方法，名称简洁为f。
	 * 用法举例：'这是第{0}层第{1}个房间'.f(5, 4) ==> 这是第5层第4个房间
	 */
	String.prototype.f = function(){
		var args = arguments;
		return this.replace(/\{(\d+)\}/g, function(m, i){
            return args[i];
        });
	}
});